package structural_pattern.composite_pattern;

/**
 * 组合模式
 *
 * 优点：
 * 1.组合模式可以清楚地定义分层次的复杂对象，表示对象的全部和部分层次。
 * 它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
 * 2.客户端可以一致地使用一个组合结构或其中单个对象，不必关系处理的是单个对象还是整个组合结构，简化了客户端代码。
 * 3.在组合模式中增加新的容器构件和叶子构件都很方便，无须对现有类库进行任何修改。符合开闭原则。
 *
 * 缺点：
 * 1.在增加新构件时很难对容器中的构件类型进行限制。因为它们来自相同的抽象层。
 *
 * 适用场景：
 * 1.在具有整体和部分的层次结构中，希望通过一种方式忽略整体与部分的差异，客户端可以一致性地对待它们。
 * 2.在一个适用面向对象语音开发的系统中需要处理一个树形结构。
 */
public class MainComposite {
    public static void main(String[] args) {
        AbstractFile file1, file2, file3, file4, file5, folder1, folder2, folder3, folder4;
        folder1 = new Folder("Sunny的资源");
        folder2 = new Folder("图像文件");
        folder3 = new Folder("文本文件");
        folder4 = new Folder("视频文件");

        file1 = new ImageFile("哈哈哈.png");
        file2 = new ImageFile("你好.gif");
        file3 = new TextFile("武功秘籍.text");
        file4 = new TextFile("宝典.doc");
        file5 = new VideoFile("笑傲天下.mp4");

        folder2.add(file1);
        folder2.add(file2);
        folder3.add(file3);
        folder3.add(file4);
        folder4.add(file5);

        folder1.add(folder2);
        folder1.add(folder3);
        folder1.add(folder4);

        folder1.killVirus();
    }
}
